package com.zackeus.xupdate.utils;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;

import androidx.annotation.NonNull;
import androidx.core.content.FileProvider;

import com.zackeus.common.utils.FileUtils;

import java.io.File;

/**
 * APK安装工具类
 * @name: ApkInstallUtils
 * @author: zz
 * @date: 2022/11/22
 */
public final class ApkInstallUtils {
    /* apk安装的请求码 */
    public static final int REQUEST_CODE_INSTALL_APP = 999;

    private ApkInstallUtils() {
        throw new UnsupportedOperationException("Do not need instantiate!");
    }

    /**
     * 使用系统的意图安装
     * @param context
     * @param filePath file path of package
     * @return whether apk exist
     */
    public static boolean install(@NonNull Context context, String filePath) {
        return install(context, new File(filePath));
    }

    /**
     * apk安装
     * @param context
     * @param apkFile apk文件
     * @return
     */
    public static boolean install(@NonNull Context context, File apkFile) {
        return FileUtils.isFileExists(apkFile) && installNormal(context, apkFile);
    }

    /**
     * 使用系统的意图进行apk安装
     * @param context 上下文
     * @param appFile 应用文件
     * @return 安装是否成功
     */
    @SuppressLint("QueryPermissionsNeeded")
    private static boolean installNormal(@NonNull Context context, File appFile) {
        Intent intent = getInstallAppIntent(context, appFile);
        if (context.getPackageManager().queryIntentActivities(intent, 0).size() > 0) {
            if (context instanceof Activity) {
                ((Activity) context).startActivityForResult(intent, REQUEST_CODE_INSTALL_APP);
            } else {
                context.startActivity(intent);
            }
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

    /**
     * 获取安装apk的意图
     * @param context
     * @param appFile
     * @return
     */
    public static Intent getInstallAppIntent(@NonNull Context context, File appFile) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //区别于 FLAG_GRANT_READ_URI_PERMISSION 跟 FLAG_GRANT_WRITE_URI_PERMISSION， URI权限会持久存在即使重启，直到明确的用 revokeUriPermission(Uri, int) 撤销。 这个flag只提供可能持久授权。但是接收的应用必须调用ContentResolver的takePersistableUriPermission(Uri, int)方法实现
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);

        String authority = context.getPackageName() + ".updateFileProvider";
        Uri fileUri = FileProvider.getUriForFile(context, authority, appFile);
        intent.setDataAndType(fileUri, "application/vnd.android.package-archive");
        return intent;
    }

}
